/*
 * ElementoCircuital.h
 *
 *  Created on: 11/11/2009
 *      Author: emiliano
 */

#ifndef ELEMENTOCIRCUITAL_H_
#define ELEMENTOCIRCUITAL_H_

#include "Excepcion.h"
#include "Conexion.h"
#include "../Constantes.h"
#include <list>
#include <string>
#include <iostream>

class Conexion;

class ElementoCircuital {
protected:
	int id;
	std::list<Conexion*> L_conexiones;
	int tipo;
	int posicion_x;
	int posicion_y;
	int angulo;
	bool seleccionado;

public:
	ElementoCircuital(int x, int y, int ID);
	virtual ~ElementoCircuital(){liberar_conexiones();}
	int get_tipo(){return tipo;}
	virtual bool calcular_salida(int nro_Salida, int& t_transicion)=0;
	int get_id(){return id;}
	virtual void desconectar_entrada(int nro){};
	virtual void set_entrada(Conexion* cable){};
	virtual bool ready()=0;

	virtual void agregar_conexion(Conexion* nueva_conexion, int nro_salida);
	virtual void liberar_conexiones();
	virtual void liberar_entradas(){};
	virtual void cortar_cable(int id_cable);

	//Metodos para la interfaz:
	void seleccionar(){this->seleccionado = true;}
	int get_posicion_x(){return posicion_x;}
	int get_posicion_y(){return posicion_y;}

	int get_nro_entrada(int x,int y);

	int get_pos_entrada1_x();

	int get_pos_entrada1_y();

	int get_pos_entrada2_x();

	int get_pos_entrada2_y();

	int get_posicion_salida_x();
	int get_posicion_salida_y();

	int get_angulo(){return angulo;}

	void rotar();
	bool is_seleccionado(){return seleccionado;}
	void deshacer_seleccion(){this->seleccionado = false;}
	void set_posicionX(int x){this->posicion_x = x;}
	void set_posicionY(int y){this->posicion_y = y;}
	void set_posicionX_rel(int x_inicial, int x_final);
	void set_posicionY_rel(int y_inicial, int y_final);
	void set_angulo(int angulo){this->angulo = angulo;}
};

#endif /* ELEMENTOCIRCUITAL_H_ */
